package com.hhz.generation.util;

import com.hhz.generation.domain.BaseData;
import freemarker.template.Configuration;

import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Hz~
 * @version 1.0
 * @date 2020/11/26 9:29
 * @Description 代码生成
 */
public class GenerateUtil {

    /**
     * 动态生成Entity、Mapper、Mapper.xml、Service、ServiceImpl、Controller、VO类
     *
     * @param tableNames    表名
     * @param outputDir     生成地址
     * @param templateDir   模板地址
     * @param parentPackage 父包路径
     * @param prefixTable   需要去掉的表名前缀
     * @param author        作者
     */
    public static void generate(String[] tableNames, String outputDir, String templateDir,
                                String parentPackage, String prefixTable, String author) {
        //获取绝对地址
        outputDir = outputDir + "\\" + parentPackage.replace(".", "\\") + "\\vo\\";
        try {
            for (String tableName : tableNames) {
                //获取类名 TODO 尚需完善这一行代码，不然提交错误
                String entity = tableName.replace(prefixTable, "");
                //获取freemarker配置
                Configuration cfg = FreemarkerUtil.getConfiguration(templateDir);
                //获取元数据
                BaseData baseDataList = DatabaseUtil.getBaseDataList(tableName);
                //封装参数
                Map<String, Object> data = new HashMap<>();
                data.put("author", author);
                data.put("entity", entity);
                data.put("parentPackage", parentPackage);
                data.put("baseDataList", baseDataList);

                File file = new File(outputDir + entity + "VO.java");
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                cfg.getTemplate("entityVO.java.ftl").process(data, new FileWriter(file));
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
}
